<?php

class timeResource{
    
   /**
    * Calcula a diferenca entre duas datas,
    * 
    * @param string $d1 <p> A data de início </p>
    * @param string $d2 <p> A data de término. Se for vazia será usada a data e hora atuais </p>
    * @param string $type <p> type = tipo da diferenca: A = Ano, M = mes, D = dia, H = hora, Mi = minuto, '' = segundo  </p>
    * @param string $sep <p> separador de data, o padrão é '-', pode ser '/' </p>
    * @return int diferença entre as datas. 
    * <p>Se a segunda data for menor do que a primeira então retorna um valor menor do que zero</p>
    * <p>Se a segunda data for maior do que a primeira então retorna um valor maior do que zero</p>
    * <p>Se as datas forem iguais, retorna zero</p> 
    */
    public static function diffDate($d1, $d2 = "", $type='', $sep='-'){

        $d2 = ($d2 == "")?date("Y-m-d H:i:s"):$d2;

        $type = strtoupper($type);
        switch ($type){
            case 'Y' :
            case 'A' : $X = 31536000; break;
            case 'M' : $X = 2592000;  break;
            case 'D' : $X = 86400;    break;
            case 'H' : $X = 3600;     break;
            case 'MI': $X = 60;       break;
            default:   $X = 1;
        }
        
        //separa data do tempo
        $time1 = timeResource::Timestamp2Time($d2);
        $time2 = timeResource::Timestamp2Time($d1);
        $res   = ($time1 - $time2)/$X;
        //if($res > -1/10 && $res < 1/10)$res = 0;
        return floor($res);

    }
    
    public static function Timestamp2Time($dateTime){
        $dateTime = explode(" ", $dateTime);
        $date = @$dateTime[0];
        $time = @$dateTime[1];
        if($time == "") $time = "00:00:00";
        $date = explode("-", $date);
        $time = explode(":", $time);
        return mktime(@$time[0], @$time[1], @$time[2], @$date[1], @$date[2], @$date[0]);
    }
    
    public static function addDayIntoDate($date, $days){
        $exp       = explode(' ', $date);
        $date      = str_replace(array("-", "/"), "", $exp[0]);
        $thisyear  = substr ( $date, 0, 4 );
        $thismonth = substr ( $date, 4, 2 );
        $thisday   = substr ( $date, 6, 2 );
        
        $hora = $min  = $seg = 0;
        if(isset($exp[1])){
            $time = str_replace(array(":", ""), "", $exp[1]);
            $hora = substr ($time, 0, 2 );
            $min  = substr ($time, 2, 2 );
            $seg  = substr ($time, 4, 2 );
            $nextdate  = mktime ($hora, $min, $seg, $thismonth, $thisday + $days, $thisyear );
            return strftime("%Y-%m-%d %H:%M:%S", $nextdate);
        }
        $nextdate  = mktime ($hora, $min, $seg, $thismonth, $thisday + $days, $thisyear );
        return strftime("%Y-%m-%d", $nextdate);
    }

    public static function subDayIntoDate($date,$days){
        $date = str_replace(array("-", "/"), "", $date);
         $thisyear = substr ( $date, 0, 4 );
         $thismonth = substr ( $date, 4, 2 );
         $thisday =  substr ( $date, 6, 2 );
         $nextdate = mktime ( 0, 0, 0, $thismonth, $thisday - $days, $thisyear );
         return strftime("%Y-%m-%d", $nextdate);
    }
    
    public static function isValidDate($dateTime){
       if($dateTime == "") return false;
       if (preg_match("/^(\d{4})-(\d{2})-(\d{2})$/", $dateTime, $matches)) {
          if (!checkdate($matches[2], $matches[3], $matches[1])){
             $this->setErrorMessage("Data no formato inválido, Digite (DD/MM/AAAA)");
             return false;
          }
       }
       return true;
    }

    private static $br = array("Domingo", "Segunda", "Terça"  , "Quarta"   , "Quinta"  , "Sexta" , "Sábado"  , "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro" , "Outubro", "Novembro", "Dezembro"," de ");
    private static $en = array("Sunday" , "Monday" , "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "January", "February" , "March", "April", "May" , "June" , "July" , "August", "September", "October", "November", "December", " DE ");
    public static function Date2StrBr($dateTime, $show_time = true){
        
        if($dateTime == "") return "";
        if(!function_exists('minutos')){
            function minutos($dateTime, $minutos, $en, $br){
                switch ($minutos){
                    case -1: $str = "Dentro de um minuto"; break;
                    case  1: $str = "Há um minuto";        break;
                    case  0: $str = "Agora";               break;
                    default: $str = ($minutos < 0)?"Dentro de ".abs($minutos)." minutos": "Há $minutos minutos";
                }
                return $str;
            }
        }
        
        if(!function_exists('horas')){
            function horas($dateTime, $horas, $en, $br){
                switch ($horas){
                    case -1: $str = "Dentro de uma Hora";   break;
                    case  1: $str = "Há uma Hora";          break;
                    case  0: $str = "Há menos de uma Hora"; break;
                    default: $str = ($horas < 0)?"Dentro de ".abs($horas)." Horas":"Há $horas Horas";
                }
                return $str;
            }
        }
        
        if(!function_exists('dias')){
            function dias($dateTime, $dias, $en, $br, $show_time = true){
                $dateTime = timeResource::Timestamp2Time($dateTime);
                $stime = ($show_time)?", às ". date("H:i:s", $dateTime):"";
                switch ($dias){
                    case -2: $str = "Depois de amanhã $stime"; break;
                    case -1: $str = "Amanhã $stime";           break;
                    case  1: $str = "Ontem $stime";            break;
                    case  2: $str = "Anteontem $stime";        break;
                    default: 
                        $stime = ($show_time)?"\à\s H:i:s":"";
                        if(abs($dias) <= 7) $str = str_replace($en, $br, date("l\, d \DE\ F $stime", $dateTime));
                        else                $str = str_replace($en, $br, date("d \DE\ F $stime", $dateTime));
                }
                return $str;
            }
        }
        
        if(!function_exists('anos')){
            function anos($dateTime, $anos, $en, $br, $show_time = true){
                $stime = ($show_time)?"\à\s H:i:s":"";
                $dateTime = timeResource::Timestamp2Time($dateTime);
                return str_replace($en, $br, date("l\, d \DE\ F \d\e Y $stime", $dateTime));
            }
        }
        
        //diferenca dentro de uma hora
        $minutos = timeResource::diffDate($dateTime, "", "Mi");
        if(abs($minutos) < 60) return minutos($dateTime, $minutos, timeResource::$en, timeResource::$br);
            
        //diferenca dentro de um dia
        $horas = timeResource::diffDate($dateTime, "", "H");
        if(abs($horas) < 24) return horas($dateTime, $horas, timeResource::$en, timeResource::$br);

        //se está no mesmo ano ou se existe uma diferença de no maximo 2 dias
        $dias = timeResource::diffDate($dateTime, "", "D");
        if(date("Y", timeResource::Timestamp2Time($dateTime)) == date("Y") || abs($dias) <= 7)
             return dias($dateTime, $dias, timeResource::$en, timeResource::$br, $show_time);
            
        //diferenca dentro de mais de um ano
        $anos = timeResource::diffDate($dateTime, "", "Y");
        return anos($dateTime, $anos, timeResource::$en, timeResource::$br, $show_time);
    }
    
    public static function getFormatedDate($date = ""){
        if($date == ""){$date = date("Y-m-d H:i:s");}
        return timeResource::convert($date);
    }
    
    public static function getDbDate($date = ""){
        if($date == "") return date("Y-m-d H:i:s");
        return timeResource::convert($date);
    }
    
    private static function convert($date){
        $exp  = explode(' ', $date);
        $date = array_shift($exp);
        $time = array_shift($exp);
        return convertData($date) . " $time";
    }
    
    public static function getTimeOfDate($date = ""){
        return ($date == "")? date("H:i:s"):date("H:i:s", timeResource::Timestamp2Time($date));
    }
    
    private static $unidade = array('day', 'week', 'month', 'year', 'hour', 'minute', 'second');
    public static function subDateTime($date, $qtd = 1, $unidade = 'days'){
        if(!in_array($unidade, timeResource::$unidade)){
            die("Erro ao subtrair string, parâmetro unidade inválido");
        }
        $date = date_create($date);
        date_sub($date, date_interval_create_from_date_string("$qtd $unidade"));
        return date_format($date, 'Y-m-d H:i:s');
    }
    
}

?>
